package com.wing.productionPlan.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.wing.common.utils.JsonResult;
import com.wing.productionPlan.dao.RequirePlanItermDao;
import com.wing.productionPlan.dao.RequirePlanProductDao;
import com.wing.productionPlan.model.entity.RequirePlan;
import com.wing.productionPlan.model.entity.RequirePlanItem;
import com.wing.productionPlan.model.entity.RequirePlanProduct;
import com.wing.productionPlan.model.response.DayTakeGoodsProductVO;
import com.wing.productionPlan.model.response.RequirePlanItermVO;
import com.wing.productionPlan.model.response.RequirePlanProductVO;
import com.wing.productionPlan.model.response.RequirePlanVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.*;


/**
 * 需求计划product-ServiceImpl
 *
 * @author
 */
@Service
@Slf4j
public class RequirePlanProductServiceImpl extends ServiceImpl<RequirePlanProductDao, RequirePlanProduct> implements RequirePlanIProductService {



    @Override
    public Page<RequirePlanProduct> selectRequirePlanProductList(Page<RequirePlanProduct> pg, Map map) {
        List<RequirePlanProduct> vos = baseMapper.selectRequirePlanProductList(pg, map);
        pg.setRecords(vos);
        return pg;
    }

    @Override
    public List<RequirePlanItermVO> selectRequirePlanImportRecord(Map map) {
        return baseMapper.selectRequirePlanImportRecord(map);
    }

    @Override
    public RequirePlanProductVO selectRequirePlanProductDetail(Long id) {
        return baseMapper.selectRequirePlanProductDetail(id);
    }

    @Override
    public  Map<String, Object> selProductSummaryData(Map map,Integer page,Integer limit) {
        if(map.get("startTime")==null && map.get("endTime")==null){
            LocalDateTime now = LocalDateTime.now();

            // 计算六个月前的第一天的开始时间 (00:00:00)
            LocalDateTime startDateTime = now.minusMonths(6)
                    .withDayOfMonth(1)
                    .toLocalDate().atStartOfDay();

            // 结束时间为今天的最后一秒 (23:59:59)，或者你可以选择当天的最后一纳秒以获得更精确的结果
            LocalDateTime endDateTime = now.toLocalDate()
                    .atTime(LocalTime.MAX); // 使用 LocalTime.MAX 表示一天的最后一刻

            // 定义日期时间格式
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM");

            // 将日期时间转换为字符串
            String startDateTimeStr = startDateTime.format(formatter);
            String endDateTimeStr = endDateTime.format(formatter);


            map.put("startTime", startDateTimeStr);
            map.put("endTime", endDateTimeStr);

        }




        // 查询数据库获取数据
        List<RequirePlanProductVO> entities = baseMapper.selProductSummaryData(map);
        // 定义静态头部信息
        List<String> staticHeaders = Arrays.asList();

        // 动态生成日期头部
        Set<String> dynamicDates = new TreeSet<>(); // 使用TreeSet以确保日期按顺序排列
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
        for (RequirePlanProductVO entity : entities) {
            System.out.println("-----------------------"+entity.getReceiveMouthDate());
            dynamicDates.add(entity.getReceiveMouthDate());
        }

        // 组装最终的头部信息
        List<String> headers = new ArrayList<>(staticHeaders);
        headers.addAll(dynamicDates);


        Map<String, Map<String, Integer>> materialDemandByDate = new HashMap<>();

        for (RequirePlanProductVO entity : entities) {
            String materialCode = entity.getMaterialCode();
            String dateKey = entity.getReceiveMouthDate();

            materialDemandByDate.computeIfAbsent(dateKey+"-"+materialCode, k -> new HashMap<>())
                    .put(dateKey+"-"+materialCode, entity.getDemandQuantity());
        }


        // 准备数据行，这里简化了实际的数据结构转换逻辑
        List<Map<String, Object>> dataRows = new ArrayList<>();
        for (RequirePlanProductVO entity : entities) {
            Map<String, Object> row = new LinkedHashMap<>();

            row.put("materialCode", entity.getMaterialCode());
            row.put("materialDescribe", entity.getMaterialDescribe());
            row.put("materialUnit", entity.getMaterialUnit());
            row.put(entity.getReceiveMouthDate(), entity.getDemandQuantity()); // 示例映射

            Integer sumDemandQuantity=0;
            // 为每个日期添加一列
            for (String date : dynamicDates) {
                Integer demandQuantity = materialDemandByDate.getOrDefault(date+"-"+entity.getMaterialCode(), Collections.emptyMap())
                        .getOrDefault(date+"-"+entity.getMaterialCode(), 0); // 默认值为0
                sumDemandQuantity=sumDemandQuantity+demandQuantity;
                row.put(date, demandQuantity);
            }
              //通过外部料号 查询内部料号 baseMapper.selInnerProductDetailId(entity.getMaterialCode())
            row.put("productDetailId", entity.getProductDetailId());
            //总需求
            row.put("sumDemandQuantity", sumDemandQuantity);
            dataRows.add(row);
        }


        // 对组装完成后的数据进行分页
        List<Map<String, Object>> paginatedDataRows = paginateData(dataRows, page, limit);

        // 组装最终的响应对象
        Map<String, Object> result = new HashMap<>();
        result.put("headers", headers);
        result.put("data", paginatedDataRows);
        result.put("currentPage", page);
        result.put("pageSize", limit);

        // 获取总记录数用于计算总页数
        int totalCount = dataRows.size();
        int totalPages = (int) Math.ceil((double) totalCount / limit);
        result.put("totalPages", totalPages);
        result.put("totalCount", totalCount);

        return result;
    }

    @Override
    public Map<String, Object> selProductSummaryDataHeads(Map map, Integer page, Integer limit) {

        if(map.get("startTime")==null && map.get("endTime")==null){
            LocalDateTime now = LocalDateTime.now();

            // 计算六个月前的第一天的开始时间 (00:00:00)
            LocalDateTime startDateTime = now.minusMonths(6)
                    .withDayOfMonth(1)
                    .toLocalDate().atStartOfDay();

            // 结束时间为今天的最后一秒 (23:59:59)，或者你可以选择当天的最后一纳秒以获得更精确的结果
            LocalDateTime endDateTime = now.toLocalDate()
                    .atTime(LocalTime.MAX); // 使用 LocalTime.MAX 表示一天的最后一刻

            // 定义日期时间格式
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM");

            // 将日期时间转换为字符串
            String startDateTimeStr = startDateTime.format(formatter);
            String endDateTimeStr = endDateTime.format(formatter);


            map.put("startTime", startDateTimeStr);
            map.put("endTime", endDateTimeStr);

        }




        // 查询数据库获取数据
        List<RequirePlanProductVO> entities = baseMapper.selProductSummaryData(map);
        // 定义静态头部信息
        List<String> staticHeaders = Arrays.asList();

        // 动态生成日期头部
        Set<String> dynamicDates = new TreeSet<>(); // 使用TreeSet以确保日期按顺序排列
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
        for (RequirePlanProductVO entity : entities) {
            System.out.println("-----------------------"+entity.getReceiveMouthDate());
            dynamicDates.add(entity.getReceiveMouthDate());
        }

        // 组装最终的头部信息
        List<String> headers = new ArrayList<>(staticHeaders);
        headers.addAll(dynamicDates);

        // 组装最终的响应对象
        Map<String, Object> result = new HashMap<>();
        result.put("headers", headers);

        return result;
    }


    /**
     * 对已有的数据行进行分页。
     *
     * @param dataRows 原始数据行列表
     * @param page 当前页码（从1开始）
     * @param size 每页大小
     * @return 分页后的数据行列表
     */
    public static List<Map<String, Object>> paginateData(List<Map<String, Object>> dataRows, int page, int size) {
        if (page <= 0 || size <= 0) {
            throw new IllegalArgumentException("Page and size must be greater than zero.");
        }

        int fromIndex = (page - 1) * size;
        if (fromIndex >= dataRows.size()) {
            return new ArrayList<>(); // 返回空列表如果请求的页码超出范围
        }

        int toIndex = Math.min(fromIndex + size, dataRows.size());
        return dataRows.subList(fromIndex, toIndex);
    }

}

